import java.util.Arrays;

import org.graalvm.compiler.lir.LIRInstruction.Temp;

/*
 * @lc app=leetcode.cn id=16 lang=java
 *
 * [16] 最接近的三数之和
 */

// @lc code=start
class Solution {
    // 这个和15题的思路基本一致，双指针发。
    public int threeSumClosest(int[] nums, int target) {
        Arrays.sort(nums);
        int ans = 0 ,d = 100000;//d是ans与target之间的差值，为0最好，取绝对值，越小越好
        for(int i =0;i<nums.length-2;i++){
            
            if(nums[i]>target && ans!=0 && nums[i]>0) break;//这个是跳过一些没必要的情况
            
            int L = i+1 ,R = nums.length-1;
            while(L<R){
                int temp = nums[i]+nums[L]+nums[R];
                int d2 = temp - target;//与target的差值
                
                if(d2 == 0){//刚好
                    return target;
                }
                else if(Math.abs(d2) < d){//d2更小，说明temp更接近
                    d = Math.abs(d2);//更新差值
                    ans = temp;
                
                }
                if(d2<0){//说明离目标小了
                    L++;
                }else{//说明离目标大了
                    R--;
                }
            }
        }
        return ans;
    }
}
// @lc code=end

